package interfaceGrafica;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.LinkedList;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

import dominioProblema.Mao;
import dominioProblema.Mesa;
import dominioProblema.Pedra;

public class InterfaceGrafica extends JFrame {

	protected static final long serialVersionUID = 1L;
	protected JPanel jContentPane = null;
	protected Mensagens msg;
	protected JTextField jtfSeusPontos;
	protected JTextField jtfPontosOponente;
	protected JTextField jtfSaldoOponente;
	protected JTextField jtfSaldoArmazem;
	protected Mesa me;
	protected JPanel painelPlacar;
	protected JPanel painelPecas;
	protected PainelAreaJogo areaJogo;
	protected JMenuItem mntmNovoJogo;
	protected JMenuItem mntmReiniciarJogo;
	protected JMenuItem mntmConectarNetgames;
	protected JMenuItem mntmDesconectarNetgames;
	protected JMenuItem mntmSair;
	
	protected JScrollPane scrollPane;

	public InterfaceGrafica(Mesa m){
		super();
		this.msg = new Mensagens();
		this.me	= m;
		painelPlacar = new JPanel();
		inicializar();
	}
	
	private void inicializar() {
		setSize(1200, 700);
		inicializarMenu();
		inicializarPainelMensagem();
		inicializarPlacar();
		inicializarAreaJogo();
		inicializarPainelPecas();
	}
	
	public void reinicializar() {
		remove(scrollPane);
		remove(painelPecas);
		revalidate();
		repaint();
		inicializarAreaJogo();
		inicializarPainelPecas();
		validate();
		repaint();
	}

	private void inicializarMenu() {
		JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);

		JMenu mnJogo = new JMenu("Jogo");
		menuBar.add(mnJogo);

		mntmConectarNetgames = new JMenuItem("Conectar NetGames");
		mntmConectarNetgames.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseReleased(MouseEvent arg0) {
				String n = msg.solicitaNome();
				String s = msg.solicitaServidor();
				boolean conectado = me.conectarNetGames(n, s);
				mntmConectarNetgames.setEnabled(!conectado);
				mntmDesconectarNetgames.setEnabled(conectado);
				mntmNovoJogo.setEnabled(conectado);
				mntmReiniciarJogo.setEnabled(conectado);
			}
		});
		mnJogo.add(mntmConectarNetgames);

		mntmDesconectarNetgames = new JMenuItem("Desconectar NetGames");
		mntmDesconectarNetgames.setEnabled(false);
		mntmDesconectarNetgames.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseReleased(MouseEvent arg0) {
				boolean conectado = me.desconectarNetGames();
				mntmDesconectarNetgames.setEnabled(false);
				mntmNovoJogo.setEnabled(false);
				mntmReiniciarJogo.setEnabled(false);
				mntmConectarNetgames.setEnabled(conectado);				
			}
		});
		mnJogo.add(mntmDesconectarNetgames);

		mntmNovoJogo = new JMenuItem("Novo Jogo");
		mntmNovoJogo.setEnabled(false);
		mntmNovoJogo.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseReleased(MouseEvent arg0) {
				me.iniciarPartida();
			}

		});
		mnJogo.add(mntmNovoJogo);

		mntmReiniciarJogo = new JMenuItem("Reiniciar Jogo");
		mntmReiniciarJogo.setEnabled(false);
		mntmReiniciarJogo.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseReleased(MouseEvent arg0) {
				me.reiniciarJogo();
			}
		});
		mnJogo.add(mntmReiniciarJogo);

		mntmSair = new JMenuItem("Sair");
		mntmSair.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseReleased(MouseEvent e) {
				me.sair();
			}
		});
		mnJogo.add(mntmSair);	
	}
	
	private void inicializarPainelMensagem() {
		JPanel painel = new JPanel();
		JLabel mensagem = new JLabel();
		mensagem.setText("Bem-Vindo");
		painel.add(mensagem);
		add(painel, BorderLayout.NORTH);
	}

	private void inicializarPlacar() {
		painelPlacar.setLayout(null);
		painelPlacar.setPreferredSize(new Dimension(200, 480));
		
		JLabel lblPlacar = new JLabel("PLACAR");
		lblPlacar.setBounds(new Rectangle(47, 0, 70, 14));
		painelPlacar.add(lblPlacar);

		JLabel lblSeusPontos = new JLabel("Seus pontos:");
		lblSeusPontos.setBounds(new Rectangle(10, 20, 107, 14));
		painelPlacar.add(lblSeusPontos);	
		jtfSeusPontos = new JTextField();
		jtfSeusPontos.setText("0");
		jtfSeusPontos.setEditable(false);
		jtfSeusPontos.setBounds(new Rectangle(10, 40, 62, 20));
		painelPlacar.add(jtfSeusPontos);
		jtfSeusPontos.setColumns(10);

		JLabel lblPontosOponente = new JLabel("Pontos oponente:");
		lblPontosOponente.setBounds(new Rectangle(10, 70, 107, 14));
		painelPlacar.add(lblPontosOponente);
		jtfPontosOponente = new JTextField();
		jtfPontosOponente.setText("0");
		jtfPontosOponente.setEditable(false);
		jtfPontosOponente.setBounds(new Rectangle(10, 90, 62, 20));
		painelPlacar.add(jtfPontosOponente);
		jtfPontosOponente.setColumns(10);

		JLabel lblSaldoOponente = new JLabel("Saldo oponente:");
		lblSaldoOponente.setBounds(new Rectangle(10, 120, 107, 14));
		painelPlacar.add(lblSaldoOponente);
		jtfSaldoOponente = new JTextField();
		jtfSaldoOponente.setText("0");
		jtfSaldoOponente.setEditable(false);
		jtfSaldoOponente.setBounds(new Rectangle(10, 140, 62, 20));
		painelPlacar.add(jtfSaldoOponente);
		jtfSaldoOponente.setColumns(10);

		JLabel lblSaldoArmazm = new JLabel("Saldo Armaz\u00E9m:");
		lblSaldoArmazm.setBounds(new Rectangle(10, 170, 107, 14));
		painelPlacar.add(lblSaldoArmazm);
		jtfSaldoArmazem = new JTextField();
		jtfSaldoArmazem.setText("0");
		jtfSaldoArmazem.setEditable(false);
		jtfSaldoArmazem.setBounds(new Rectangle(10, 190, 62, 20));
		painelPlacar.add(jtfSaldoArmazem);
		jtfSaldoArmazem.setColumns(10);

		JLabel lblPontuaoMxima = new JLabel("Pontua\u00E7\u00E3o M\u00E1xima = 100");
		lblPontuaoMxima.setBounds(new Rectangle(10, 230, 180, 14));
		painelPlacar.add(lblPontuaoMxima);

		add(painelPlacar, BorderLayout.WEST);	
	}
	
	private void inicializarAreaJogo() {
		areaJogo = new PainelAreaJogo(this);
		areaJogo.setPreferredSize(new Dimension(3000, 3000));
		scrollPane = new JScrollPane(areaJogo);
		add(scrollPane, BorderLayout.CENTER);
	}
	
	private void inicializarPainelPecas() {
		painelPecas = new JPanel();
		add(painelPecas, BorderLayout.SOUTH);
	}
	
	public void carregarPecas(Mao maoJog) {
		scrollPane.getHorizontalScrollBar().setValue(1050);
        scrollPane.getVerticalScrollBar().setValue(1300);	
		int i =0;
		while (i<maoJog.getPedras().length){
			if(maoJog.getPedras()[i]!=null){
				JLabel peca = new Peca(maoJog.getPedras()[i]);
				if(!maoJog.getPedras()[i].getPeca().equals("55"))
					painelPecas.add(peca);
			}
			i++;
		}
		painelPecas.validate();
		painelPecas.repaint();
		validate();
		repaint();
	}
	
	public void informarPecaJogada(Pedra pedra, int ponta) {
		me.continuarJogada(pedra, ponta);
	}
	
	public void atualizarAreaJogo(LinkedList<Pedra> disposPedras, LinkedList<Pedra> ptaC,
			LinkedList<Pedra> ptaD, int ponta) {
		areaJogo.atualizarDisposicao(disposPedras, ptaC, ptaD, ponta);
		areaJogo.validate();
		areaJogo.repaint();
		validate();
		repaint();
    }
	
	public void reverterAreaJogo(Pedra pedra) {
		areaJogo.reverterDisposicao();
		JLabel peca = new Peca(pedra);
		painelPecas.add(peca);
		areaJogo.validate();
		areaJogo.repaint();
		painelPecas.validate();
		painelPecas.repaint();
		validate();
		repaint();
    }
	
	public void atualizarPlacarInterface(int pontosJogador, int pontosOponente, int saldoOponente, int qtArmazem) {
		jtfSeusPontos.setText(Integer.toString(pontosJogador));
		jtfPontosOponente.setText(Integer.toString(pontosOponente));
		jtfSaldoOponente.setText(Integer.toString(saldoOponente));
		jtfSaldoArmazem.setText(Integer.toString(qtArmazem));
	}

	public void habilitarInterface(boolean habilita) {
		Component[] componente = painelPecas.getComponents();
		if(habilita) {
			for (int a = 0; a < componente.length; a++) {  
				componente[a].setEnabled(true);
			}
		} else {
			for (int a = 0; a < componente.length; a++) {  
				componente[a].setEnabled(false);  
			}
		}
	}

	public void iniciarDouble5(Pedra pedra) {
		areaJogo.posicionarDouble5(pedra);
		me.continuarJogada(pedra, 1);
		areaJogo.validate();
		areaJogo.repaint();
		validate();
		repaint();
	}

	public void incluiPedra(Pedra pedra) {
		JLabel peca = new Peca(pedra);
		painelPecas.add(peca);
		painelPecas.validate();
		painelPecas.repaint();
		validate();
		repaint();
	}
	
}